home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / TSR / STAY50 / MACROS.PAS < prev    next >
Pascal/Delphi Source File  |  1988-11-17  |  4KB  |  87 lines

  1.  
  2. {  Copyright (C) 1988 Lane H. Ferris                                         }
  3.  
  4.  unit macros ;
  5.  
  6.  {───────────────────────────────────────────────────────────────────}
  7.                              interface
  8.  {───────────────────────────────────────────────────────────────────}
  9.   type
  10.     Vector  = record             { Interrupt Vector type   }
  11.     ofs,Seg : word    ;
  12.     end               ;
  13.     Vec     = vector  ;          { lazy Vector             }
  14.   {───────────────────────────────────────────────────────────────}
  15.   {      M A C R O S               Public  Macros                 }
  16.   {───────────────────────────────────────────────────────────────}
  17.    Procedure Break; inline($cc)     ; { Invoke the debugger }
  18.    Procedure NMI  ; inline($CD/$02) ; { Invoke the debugger }
  19.  
  20.    Procedure IncPtr(var P1; count : word) ;
  21.             { increment a pointer or doubleword  }
  22.             inline($58/ { POP AX     fetch count }
  23.             $5F/        { POP DI     fetch ofs   }
  24.             $07/        { POP ES     fetch seg   }
  25.             $26/        { ES:                    }
  26.             $01/$05/    { ADD [DI],AX add count  }
  27.             $73/$0B/    { JNB exit    no ovfl    }
  28.             $26/        { ES:     inc segment    }
  29.             $8B/$45/$02/{ MOV     AX,[DI+02]     }
  30.             $05/$00/$10/{ ADD     AX,0100        }
  31.             $26/        { ES:                    }
  32.             $89/$45/$02 { MOV     [DI+02],AX     }
  33.             ) ;
  34.       {END IncPtr}
  35.  {───────────────────────────────────────────────────────────────────}
  36.  {                        M A C R O S    private                     }
  37.  {───────────────────────────────────────────────────────────────────}
  38.   Procedure Punt ; inline($EB/$00) ; { jmp to next instruction }
  39.   Procedure EnableInterrupts       ; inline($FB) ;
  40.   Procedure DisableInterrupts      ; inline($FA) ;
  41.   Procedure SetSp(value:word)      ; { Set StackPointer  }
  42.             inline($58/$89/$C4)    ; { POP AX/ MOV SP,AX }
  43.  
  44.   Function  GetBP : Word ;           { Get Base Pointer  }
  45.              inline($89/$E8)       ; { MOV AX,BP         }
  46.  
  47.   Procedure Push(L1 :Word)         ; { word already stked}
  48.              inline($90)           ; { leave on stack    }
  49.  
  50.   Procedure Pop(var L1)            ; { fetch stack word  }
  51.              inline($5F/$07/         { POP DI, POP ES    }
  52.                   $26/$8F/$05)     ; { pop ES:[DI]       }
  53.  
  54.   Procedure Pushflags              ; { push flags on stack }
  55.              inline($9C)           ; { leave on stack    }
  56.  
  57.   Procedure MovDS(var L1)          ; { fetch stack word  }
  58.              inline($5F/$07/         { POP DI, POP ES    }
  59.                 $26/$8E/$1D)       ; { Mov DS,ES:[DI]    }
  60.  
  61.   Procedure SwitchToStack(stackptr : pointer ) ;
  62.             inline($FA/              { DisableInterrupts }
  63.                    $5B/              { POP BX            }
  64.                    $17/              { POP SS            }
  65.                    $89/$DC/          { MOV SP,BX         }
  66.                    $FB/              { STI               }
  67.                    $89/$E5 );        { MOV BP,SP         }
  68.  
  69.   procedure CallFar(ProcAddr : Pointer);
  70.              inline($55/             { PUSH   BP         }
  71.                     $89/$E5/         { MOV    BP,SP      }
  72.                     $E8/$00/$00/     { CALL   nxtinst    } { get end of macro }
  73.                     $5B/             { POP    BX         } { addr as return @ }
  74.                     $81/$C3/$11/$00/ { ADD    BX,0011    } { add end of macro }
  75.                     $8C/$C8/         { MOV    AX,CS      } { retn addr to AX  }
  76.                     $87/$5E/$02/     { XCHG   [BP+02],BX } { new rtn addr to  }
  77.                     $87/$46/$04/     { XCHG   [BP+04],AX } { old call addr    }
  78.                     $5D/             { POP    BP         } { restore bp       }
  79.                     $50/             { PUSH   AX         } { Push far routine }
  80.                     $53/             { PUSH   BX         } { and call it      }
  81.                     $CB              { RETF              }
  82.                         ) ;
  83.  {────────────────────────────────────────────────────────────────────}
  84.  
  85. implementation
  86. begin end .
  87.